package com.atguigu.spring.service.impl;

import com.atguigu.spring.dao.BookDao;
import com.atguigu.spring.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * 声明式事务的配置步骤：
 *  1.在Spring的配置文件中配置事务管理器
 *  2.开启事务的注解驱动
 * 在需要被事务管理的方法上，添加@Transactional注解，该方法就会被事务管理
 *
 * @Transactional 注解标识的位置
 *  1.标识在方法上
 *  2.标识在类上，则类中所有的方法都会被事务管理
 *
 * @Transactional(propagation = Propagation.REQUIRED)，
 * 默认情况，表示如果当前线程上有已经开启的事务可用，那么就在这个事务中运行。
 *
 * @Transactional(propagation = Propagation.REQUIRES_NEW)
 * 表示不管当前线程上是否有已经开启的事务，都要开启新事务。
 */
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;

//    @Transactional(
////            readOnly = true 只读
////            timeout = 3  超时
////            noRollbackFor = ArithmeticException.class 回滚
////            isolation = Isolation.DEFAULT  隔离级别
//            propagation = Propagation.REQUIRED
//
//    )
    public void buyBook(Integer bookId, Integer userId) {
        //查询图书的价格
        Integer price = bookDao.getPriceByBookId(bookId);
        //更新图书的库存
        bookDao.updateStock(bookId);
        //更新用户的余额
        bookDao.updateBalance(userId, price);
    }
}
